package reflect;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URISyntaxException;

/**
 * 综合案例
 * 自动扫描reflect包中所有被@AutoRunClass注解修饰的类,并自动执行其中
 * 被@AutoRun注解修饰的方法若干次.
 */
public class ReflectDemo9 {
    public static void main(String[] args) throws Exception {
        //扫描并输出reflect包中被@AutoRunClass修饰的类
        File dir = new File(
                ReflectDemo9.class.getClassLoader().getResource(
                        "reflect"
                ).toURI()
        );
        File[] subs = dir.listFiles(e->e.getName().endsWith(".class"));
        for(File sub : subs){
            //根据字节码文件名确定类名
            String className = sub.getName().substring(
                    0,sub.getName().indexOf("."));
            Class cls = Class.forName("reflect."+className);
            //判断是否为@AutoRunClass修饰
            if(cls.isAnnotationPresent(AutoRunClass.class)){
                System.out.println("正在实例化:"+className);
                Object obj = cls.newInstance();

                Method[] methods = cls.getDeclaredMethods();
                for(Method m : methods){
                    if(m.isAnnotationPresent(AutoRun.class)){
                        AutoRun autoRun = m.getAnnotation(AutoRun.class);
                        int value = autoRun.value();
                        for(int i=0;i<value;i++){
                            m.invoke(obj);
                        }
                    }
                }
            }

        }
    }
}
